home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume19 / untype1 / part01 next >
Encoding:
Text File  |  1991-05-19  |  44.0 KB  |  1,398 lines

  1. Newsgroups: comp.sources.misc
  2. From: Chris Sears <sears@Decwrl.dec.com>
  3. Subject:  v19i094:  untype1 - PostScript Type 1 Font Decryption, Part01/01
  4. Message-ID: <1991May18.181734.18629@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 4558c25af46a00a5c0979bc16dec377e
  6. Date: Sat, 18 May 1991 18:17:34 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Chris Sears <sears@Decwrl.dec.com>
  10. Posting-number: Volume 19, Issue 94
  11. Archive-name: untype1/part01
  12.  
  13.     These utilities decrypt an Adobe Type 1 font and leave a raw PostScript
  14. file as a result.  Most of this procedure is documented in the Adobe Black 
  15. Book,"Adobe Type 1 Font Format."
  16.  
  17.     The purpose here is both to have a tool that can be used for decrypting
  18. fonts into a format more palatable for graphics programs to ingest directly
  19. and also as a reference implementation for PostScript interpreters.
  20. that end, I try to be more clear than efficient.
  21.  
  22.     For the most part untype1 is now unimportant, as the new releases of the
  23. Adobe PostScript interpreters, for example, Display PostScript release 1006.9,
  24. use unprotected versions of the built-in fonts.  You can't get at the high
  25. resolution versions from a low-resolution interpreter but using Display
  26. PostScript directly is a LOT easier to work with.
  27.  
  28.     Chris Sears
  29.     sears@decwse.pa.dec.com
  30. -----
  31. #!/bin/sh
  32. # This is a shell archive (produced by shar 3.49)
  33. # To extract the files from this archive, save it to a file, remove
  34. # everything above the "!/bin/sh" line above, and type "sh file_name".
  35. #
  36. # made 04/30/1991 23:47 UTC by sears@blofeld.pa.dec.com
  37. # Source directory /nfs/catacomb/cc1/sears/untype1
  38. #
  39. # existing files will NOT be overwritten unless -c is specified
  40. #
  41. # This shar contains:
  42. # length  mode       name
  43. # ------ ---------- ------------------------------------------
  44. #    350 -rw-rw-rw- Makefile
  45. #   9436 -rw-r--r-- README
  46. #   5787 -rw-r--r-- chars.c
  47. #   1833 -rw-rw-rw- eexec.c
  48. #   5109 -rw-r--r-- untype1_header.ps
  49. #   1639 -rw-r--r-- untype1_trailer.ps
  50. #    764 -rwxr-xr-x untype1
  51. #   9054 -rw-r--r-- un-adobe.hqx
  52. #     81 -rw-r--r-- view_header.ps
  53. #   1031 -rw-r--r-- view_trailer.ps
  54. #   1661 -rw-r--r-- reenc.ps
  55. #     21 -rw-r--r-- patchlevel.h
  56. #
  57. # ============= Makefile ==============
  58. if test -f 'Makefile' -a X"$1" != X"-c"; then
  59.     echo 'x - skipping Makefile (File already exists)'
  60. else
  61. echo 'x - extracting Makefile (Text)'
  62. sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
  63. CFLAGS = -O
  64. X
  65. all:    eexec chars
  66. X
  67. eexec:    eexec.c
  68. X    cc ${CFLAGS} -o eexec eexec.c
  69. X
  70. chars:    chars.c
  71. X    cc ${CFLAGS} -o chars chars.c
  72. X
  73. clean:
  74. X    rm -f eexec.o chars.o eexec chars untype1.shar
  75. X
  76. shar:
  77. X    shar Makefile README chars.c eexec.c untype1_header.ps untype1_trailer.ps untype1 un-adobe.hqx view_header.ps view_trailer.ps reenc.ps patchlevel.h >untype1.shar
  78. SHAR_EOF
  79. chmod 0666 Makefile ||
  80. echo 'restore of Makefile failed'
  81. Wc_c="`wc -c < 'Makefile'`"
  82. test 350 -eq "$Wc_c" ||
  83.     echo 'Makefile: original size 350, current size' "$Wc_c"
  84. fi
  85. # ============= README ==============
  86. if test -f 'README' -a X"$1" != X"-c"; then
  87.     echo 'x - skipping README (File already exists)'
  88. else
  89. echo 'x - extracting README (Text)'
  90. sed 's/^X//' << 'SHAR_EOF' > 'README' &&
  91. untype1 - Adobe Type 1 Font Decryption
  92. X
  93. Chris B. Sears
  94. sears@pa.dec.com
  95. Digital Equipment Corporation
  96. May 31, 1990
  97. X
  98. INTRODUCTION
  99. X
  100. X    These utilities decrypt an Adobe Type 1 font and leave a raw PostScript
  101. file as a result.  Most of this procedure is documented in the Adobe Black Book,
  102. "Adobe Type 1 Font Format."  It can be ordered directly from Adobe Systems.
  103. This book is referenced here and in the code as the Black Book.
  104. X
  105. X    The purpose here is both to have a tool that can be used for decrypting
  106. fonts into a format more palatable for graphics programs to ingest directly
  107. and also as a reference implementation for PostScript interpreters.  Towards
  108. that end, I try to be more clear than efficient.
  109. X
  110. POSTSCRIPT RESULTS
  111. X
  112. X    The result of untype1 is a very simple PostScript file containing only:
  113. X
  114. X        /name
  115. X        integers
  116. X        closepath
  117. X        curveto
  118. X        lineto
  119. X        moveto
  120. X        def
  121. X        { }
  122. X
  123. X    Each character outline becomes a single PostScript procedure:
  124. X
  125. X    0. the first three definitions are the Copyright, Notice and FullName.
  126. X    1. each procedure occupies a single line.  Lines can be very long.
  127. X    2. the syntax is very simple PostScript, easily parsed by a yacc/lex filter.
  128. X    3. all arguments directly precede the PostScript command.
  129. X    4. the variable charWidth is set to the width of the character.
  130. X    5. the procedure creates a path corresponding to the character.
  131. X    6. the font bounding box is generally based on a 1000x1000 FontBBox.
  132. X
  133. X    For example:
  134. X
  135. X        /period { /charWidth 287 def 79 52 moveto 79 18 109 -12 143 -12 curveto 177 -12 207 18 207 52 curveto 207 86 177 116 143 116 curveto 109 116 79 86 79 52 curveto closepath 79 52 moveto } def
  136. X
  137. X    The trailing moveto is hard to get rid of.  It is an artifact of the
  138. semantics of the Type 1 closepath definition which leaves the currentpoint
  139. in the path.  See page 51 of the Black Book.  It is easily ignored.
  140. Note that with GhostScript 2.0, the moveto is omitted.
  141. X
  142. USING UNTYPE1
  143. X
  144. X    Converting a Type 1 font program into the outlines is done in two phases.
  145. It assumes that you have a Macintosh, a Unix system and Display Postscript.
  146. NeWS, GhostScript or a LaserWriter can be used to interpret as well.
  147. PostScript that I use is pretty simple, but the implementation limits of
  148. other systems may break this approach.
  149. X
  150. X    1. Using un-adobe, which is in hqx format, convert the Type 1 font into
  151. X       a eexec encoded text file.  Un-adobe.hqx was snarfed off of SUMEX.
  152. X    2. Using untype1, a shell script driver, convert the results into a list
  153. X       of simple PostScript programs.
  154. X
  155. X    Here is a description of the files in this directory:
  156. X
  157. X    untype1
  158. X        a shell script that uses eexec, chars and DPStest to take
  159. X        an ASCII PostScript PostScript file with an encrypted Adobe Type 1
  160. X        font and generate raw PostScript for the font
  161. X    Makefile
  162. X        a make(1) description file for compiling exec.c and chars.c
  163. X    eexec.c
  164. X        decrypts a font file encrypted for the eexec operator
  165. X    chars.c
  166. X        decrypts a font file of encrypted CharStrings.  chars couldn't
  167. X        easily be written to accept standard input because it repositions
  168. X        itself with fseek() after a charstring has been decrypted.
  169. X    untype1_header.ps
  170. X    untype1_trailer.ps
  171. X        PostScript wrappers that remove font hints, squash procedures
  172. X        and transform operators and operands.
  173. X    un-adobe.hqx
  174. X        a Macintosh application that converts an Adobe PostScript
  175. X        font into an ASCII file for transfer to a UNIX system
  176. X    view_header.ps
  177. X    view_trailer.ps
  178. X        After converting a Type 1 file, these files can be used
  179. X        for viewing the results with Display PostScript.
  180. X
  181. X    To decrypt a Type 1 font first transform the Adobe font file into a text
  182. file on a Macintosh.  This can be done with the Macintosh program in unadobe.hqx
  183. written by Jerry Keough and Ted Ede at Mitre Corporation.  Next transfer the
  184. encrypted PostScript file from the Macintosh to your UNIX system with a file
  185. transfer utility like NCSA Telnet or Kermit.  Be sure to transfer this file in
  186. text mode and *not* binary mode).  Once the font file is on your UNIX system,
  187. you can perform the decryption with the shell script untype1.
  188. X
  189. X    untype1 is basically three pass: it runs eexec and chars, wraps the output
  190. with untype1_header.ps and untype1_trailer.ps and then runs it through Display
  191. PostScript.  To interact with Display PostScript we use dpstest(1X) found in
  192. /usr/examples/dps/dpstest in the Ultrix release.
  193. X
  194. X    view_header.ps and view_trailer.ps are useful for displaying the font
  195. using Display PostScript. Concatenate view_header.ps, the font file and
  196. view_trailer.ps together.  The results can be viewed with DPStest.
  197. X
  198. CURRENT BUGS AND LIMITATIONS
  199. X
  200. X    1. I don't understand the Type 1 sbw command.  The y component of the
  201. X       width vector is currently ignored.  What fonts use this, Kanji?
  202. X    2. Using GhostScript as the interpreter doesn't work entirely because
  203. X       GhostScript hasn't completely implemented save/restore semantics.
  204. X       These are used by hybrid fonts such as Optima which have hires and
  205. X       lowres dictionaries.  Non-hybrid fonts work.  The work around is to
  206. X       use the hires version.  Redefining dtransform fakes the font program
  207. X       into thinking that it is on a 2540 dpi device.  GhostScript is about
  208. X       10 times faster than Display PostScript.
  209. X    3. GhostScript omits the trailing moveto.
  210. X    4. FontBBox or FontMatrix aren't parsed.  Actually, not much is.
  211. X    5. Kevin O'Gorman reports that he gets VMErrors on a LaserWriter.
  212. X
  213. COPYRIGHT NOTICE
  214. X
  215. Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  216. X
  217. X                       All Rights Reserved
  218. X
  219. Permission to use, copy, modify, and distribute this software and its
  220. documentation for any purpose and without fee is hereby granted,
  221. provided that the above copyright notice appear in all copies and that
  222. both that copyright notice and this permission notice appear in
  223. supporting documentation, and that the name of Digital not be
  224. used in advertising or publicity pertaining to distribution of the
  225. software without specific, written prior permission.
  226. X
  227. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  228. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  229. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  230. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  231. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  232. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  233. SOFTWARE.
  234. X
  235. RELEASE NOTES AND CHANGES
  236. X
  237. November 9, 1990
  238. X
  239. StoneSerif used " -| " rather than " RD " to read the encrypted charstrings.
  240. There is a bug with seac where the x origin of accented characters is wrong.
  241. Renamed the shell script transform to untype1.
  242. The untype1_header.ps and untype1_trailer.ps files were substantially revised
  243. to use the pathforall operator.  This resulted in much simple code and the
  244. resulting PostScript output was much simpler still.  Used bind def.
  245. X
  246. November 15, 1990
  247. X
  248. Added charWidth definitions to the resulting procedures.
  249. Changed view_trailer.ps to underline the width on the baseline.
  250. Added flattenpath and setflat but commented it out.
  251. The setflat parameter should probably be increased to reduce the number
  252. of line segments in a flattened character outline.
  253. X
  254. November 19, 1990
  255. X
  256. Added a define for SEEK_SET.  Some people on the net didn't have this
  257. in their <stdio.h>
  258. X
  259. November 23, 1990
  260. X
  261. I tried using GhostScript instead of DPStest and ran into a bug with
  262. save/restore.  I submitted a bug report to Peter Deutsch.
  263. Added GhostScript and NeWS command lines in the untype1 shell script.
  264. Just comment out DPStest and uncomment out your favorite PostScript
  265. interpreter.  DPStest is much more useful here than dxpsview.
  266. X
  267. November 25, 1990
  268. X
  269. There are often two font programs in a Type 1 file: one suitable for a
  270. high-resolution typesetter and a simpler faster one for a LaserWriter.
  271. I added a dtransform routine to fool the font program into thinking that
  272. it is running on a high-resolution device.  This can be commented out
  273. if the low-resolution version is needed.
  274. X
  275. December 4, 1990
  276. X
  277. The differing control points problem was overcome by rounding before
  278. converting to integer in untype1_trailer.ps.  GhostScript and PostScript
  279. now generate the same results except for hash ordering and trailing moveto.
  280. The untype1 shell script was modified to be position independent.
  281. You can now run it from a directory other than the current directory.
  282. seac still doesn't work completely correctly.  It is an Adobe docubug.
  283. The hsbw IS used more than once.  In fact with a seac font, it is used
  284. 3 times.  I gave up trying to get Adobe to explain it.
  285. X
  286. December 28, 1990
  287. X
  288. The Copyright notice is retained with the decrypted font.  There is a
  289. save/restore pair in the font dictionary loop in untype1_trailer.ps.
  290. This should correct the LaserWriter VMErrors.
  291. X
  292. January 16, 1991
  293. X
  294. Added the "12 15" testadd opcode definition that Peter Deutsch mentioned
  295. in 2.1 GhostScript.  It doesn't seem to work.
  296. X
  297. April 30, 1991
  298. X
  299. For the most part untype1 is unimportant with the new releases of the
  300. Adobe PostScript interpreters.  Display PostScript release 1006.9 uses
  301. unprotected versions of the built-in fonts.  You can't get at the high
  302. resolution versions from a low-resolution interpreter but it is a LOT
  303. easier to work with.
  304. SHAR_EOF
  305. chmod 0644 README ||
  306. echo 'restore of README failed'
  307. Wc_c="`wc -c < 'README'`"
  308. test 9436 -eq "$Wc_c" ||
  309.     echo 'README: original size 9436, current size' "$Wc_c"
  310. fi
  311. # ============= chars.c ==============
  312. if test -f 'chars.c' -a X"$1" != X"-c"; then
  313.     echo 'x - skipping chars.c (File already exists)'
  314. else
  315. echo 'x - extracting chars.c (Text)'
  316. sed 's/^X//' << 'SHAR_EOF' > 'chars.c' &&
  317. /*
  318. X * chars.c -- decrypt an Adobe font file of encrypted CharStrings
  319. X *
  320. X * Chris B. Sears
  321. X */
  322. #include <stdio.h>
  323. #include <strings.h>
  324. X
  325. #define TRUE            1
  326. #define FALSE            0
  327. X
  328. #ifndef SEEK_SET
  329. #define SEEK_SET        0        /* Some <stdio.h> files don't have this */
  330. #endif
  331. X
  332. int lenIV = 4;                    /* the default CharString salt length is 4 */
  333. X
  334. typedef struct {
  335. X    char *command;
  336. X    int value;
  337. } Command;
  338. X
  339. Command commands[] = {
  340. X    { "notdefined_c0",    0 }, { "hstem",                1 },
  341. X    { "notdefined_c2",    2 }, { "vstem",                3 },
  342. X    { "vmoveto",        4 }, { "chars_rlineto",        5 },
  343. X    { "hlineto",        6 }, { "vlineto",            7 },
  344. X    { "rrcurveto",        8 }, { "chars_closepath",    9 },
  345. X    { "callsubr",        10 }, { "return",            11 },
  346. X    { "escape",            12 }, { "hsbw",                13 },
  347. X    { "endchar",        14 }, { "notdefined_c16",    15 },
  348. X    { "notdefined_c16",    16 }, { "notdefined_c17",    17 },
  349. X    { "notdefined_c18",    18 }, { "notdefined_c19",    19 },
  350. X    { "notdefined_c20",    20 }, { "chars_rmoveto",    21 },
  351. X    { "hmoveto",        22 }, { "notdefined_c23",    23 },
  352. X    { "notdefined_c24",    24 }, { "notdefined_c25",    25 },
  353. X    { "notdefined_c26",    26 }, { "notdefined_c27",    27 },
  354. X    { "notdefined_c28",    28 }, { "notdefined_c29",    29 },
  355. X    { "vhcurveto",        30 }, { "hvcurveto",        31 }
  356. };
  357. X
  358. Command escapes[] = {
  359. X    { "dotsection",        0 }, { "vstem3",            1 },
  360. X    { "hstem3",            2 }, { "notdefined_e3",        3 },
  361. X    { "notdefined_e4",    4 }, { "notdefined_e5",        5 },
  362. X    { "seac",            6 }, { "sbw",                7 },
  363. X    { "notdefined_e8",    8 }, { "notdefined_e9",        9 },
  364. X    { "notdefined_e10",    10 }, { "notdefined_e11",    11 },
  365. X    { "chars_div",        12 }, { "notdefined_e13",    13 },
  366. X    { "notdefined_e14",    14 }, { "testadd",            15 },
  367. X    { "callothersubr",    16 }, { "chars_pop",        17 },
  368. X    { "notdefined_e18",    18 }, { "notdefined_e19",    19 },
  369. X    { "notdefined_e20",    20 }, { "notdefined_e21",    21 },
  370. X    { "notdefined_e22",    22 }, { "notdefined_e23",    23 },
  371. X    { "notdefined_e24",    24 }, { "notdefined_e25",    25 },
  372. X    { "notdefined_e26",    26 }, { "notdefined_e27",    27 },
  373. X    { "notdefined_e28",    28 }, { "notdefined_e29",    29 },
  374. X    { "notdefined_e30",    30 }, { "notdefined_e31",    31 },
  375. X    { "notdefined_e32",    32 }, { "setcurrentpoint",    33 }
  376. };
  377. X
  378. #define MAX_ESCAPE        33
  379. X
  380. #define CR                4330
  381. #define CC1                52845
  382. #define CC2                22719
  383. X
  384. unsigned short int cr, cc1, cc2;
  385. X
  386. unsigned char
  387. DeCrypt(cipher)
  388. X    unsigned char cipher;
  389. {
  390. X    unsigned char plain;
  391. X
  392. X    plain = (cipher ^ (cr >> 8));
  393. X    cr = (cipher + cr) * cc1 + cc2;
  394. X
  395. X    return plain;
  396. }
  397. X
  398. /*
  399. X * This is necessary because some C libraries aren't ANSI C compliant yet.
  400. X */
  401. char *
  402. StrStr(string, match)
  403. X    char *string, *match;
  404. {
  405. X    int i, length;
  406. X
  407. X    length = strlen(match);
  408. X
  409. X    for (i = strlen(string) - length; i >= 0; i--, string++)
  410. X        if (!strncmp(match, string, length))
  411. X            return string;
  412. X
  413. X    return NULL;
  414. }
  415. X
  416. void
  417. main(argc, argv)
  418. X    int argc;
  419. X    char **argv;
  420. {
  421. X    FILE *in, *out;
  422. X    unsigned char in_buff[BUFSIZ], byte, *rd_pos, *count_pos;
  423. X    int line_pos, i, count;
  424. X    long value;
  425. X
  426. X    if (argc != 3) {
  427. X        fprintf(stderr, "Usage: %s input output\n", argv[0]);
  428. X        exit(0);
  429. X    }
  430. X
  431. X    if ((in = fopen(argv[1], "r")) == NULL) {
  432. X        fprintf(stderr, "%s: can't open %s\n", argv[0], argv[1]);
  433. X        exit(0);
  434. X    }
  435. X
  436. X    if ((out = fopen(argv[2], "w")) == NULL) {
  437. X        fprintf(stderr, "%s: can't open %s\n", argv[0], argv[2]);
  438. X        exit(0);
  439. X    }
  440. X
  441. X    setbuf(out, NULL);
  442. X
  443. X    /*
  444. X     * TODO: rewrite this so as not to use a seek and to use stdin.
  445. X     */
  446. X    for (;;) {
  447. X        line_pos = ftell(in);
  448. X
  449. X        if (fgets((char *) in_buff, BUFSIZ, in) == NULL)
  450. X            break;
  451. X
  452. X        if (strncmp("/lenIV", (char *) in_buff, 6) == 0)
  453. X            lenIV = atoi(in_buff + 7);
  454. X
  455. X        if ((rd_pos = (unsigned char *) StrStr(in_buff, " RD ")) == NULL) {
  456. X            if ((rd_pos = (unsigned char *) StrStr(in_buff, " -| ")) == NULL) {
  457. X                fputs((char *) in_buff, out);
  458. X                continue;
  459. X            }
  460. X        }
  461. X
  462. X        /*
  463. X         * We found an encrypted CharString.
  464. X         * Back up and determine the number of encrypted characters.
  465. X         * These have the form: dup 105 9 RD 9bytesofdata noaccess put
  466. X         */
  467. X        for (count_pos = rd_pos - 1;
  468. X            (count_pos >= in_buff) && (*count_pos != ' ');
  469. X            count_pos--)
  470. X                ;
  471. X
  472. X        if (*count_pos == ' ')    /* This can be at the beginning of a line */
  473. X            count_pos++;
  474. X
  475. X        /*
  476. X         * Write out the beginning of the string without the RD stuff.
  477. X         */
  478. X        fwrite(in_buff, count_pos - in_buff, 1, out);
  479. X        fprintf(out, "{");
  480. X
  481. X        count = atoi(count_pos);
  482. X
  483. X        /*
  484. X         * Seek to and read the binary data.
  485. X         */
  486. X        fseek(in, line_pos + (rd_pos - in_buff) + 4, SEEK_SET);
  487. X        fread(in_buff, BUFSIZ, 1, in);
  488. X
  489. X        /*
  490. X         * We must restart the decryption machinery for each CharString.
  491. X         */
  492. X        cr = CR;
  493. X        cc1 = CC1;
  494. X        cc2 = CC2;
  495. X
  496. X        /*
  497. X         * Skip over the salt.
  498. X         */
  499. X        for (i = 0; i < lenIV; i++)
  500. X            byte = DeCrypt(in_buff[i]);
  501. X
  502. X        /*
  503. X         * Translate the buffer.
  504. X         */
  505. X        for (; i < count;) {
  506. X            byte = DeCrypt(in_buff[i++]);
  507. X            if (byte == 11) {            /* return */
  508. X                fprintf(out, " %s", commands[byte].command);
  509. X                break;
  510. X            } else if (byte == 12) {    /* escape */
  511. X                byte = DeCrypt(in_buff[i++]);
  512. X                if (byte > MAX_ESCAPE)
  513. X                    fprintf(out, " not_defined_e%d", byte);
  514. X                else
  515. X                    fprintf(out, " %s", escapes[byte].command);
  516. X                continue;
  517. X            } else if (byte < 32)
  518. X                fprintf(out, " %s", commands[byte].command);
  519. X
  520. X            if (byte >= 32) {
  521. X                if (byte <= 246)
  522. X                    fprintf(out, " %d", byte - 139);
  523. X                else if ((byte >= 247) && (byte <= 250))
  524. X                    fprintf(out, " %d",
  525. X                        (byte - 247) * 256 + DeCrypt(in_buff[i++]) + 108);
  526. X                else if ((byte >= 251) && (byte <= 254))
  527. X                    fprintf(out, " %d",
  528. X                        -(byte - 251) * 256 - DeCrypt(in_buff[i++]) - 108);
  529. X                else if (byte == 255) {
  530. X                    value = DeCrypt(in_buff[i++]);
  531. X                    value <<= 8;
  532. X                    value += DeCrypt(in_buff[i++]);
  533. X                    value <<= 8;
  534. X                    value += DeCrypt(in_buff[i++]);
  535. X                    value <<= 8;
  536. X                    value += DeCrypt(in_buff[i++]);
  537. X                    fprintf(out, " %d", value);
  538. X                }
  539. X            }
  540. X        }
  541. X
  542. X        fprintf(out, " }");
  543. X
  544. X        /*
  545. X         * Seek just past the CharString bytes and continue.
  546. X         */
  547. X        fseek(in, line_pos + (rd_pos - in_buff) + 4 + i, SEEK_SET);
  548. X    }
  549. X
  550. X    fclose(in);
  551. X    fclose(out);
  552. X
  553. X    exit(0);
  554. }
  555. SHAR_EOF
  556. chmod 0644 chars.c ||
  557. echo 'restore of chars.c failed'
  558. Wc_c="`wc -c < 'chars.c'`"
  559. test 5787 -eq "$Wc_c" ||
  560.     echo 'chars.c: original size 5787, current size' "$Wc_c"
  561. fi
  562. # ============= eexec.c ==============
  563. if test -f 'eexec.c' -a X"$1" != X"-c"; then
  564.     echo 'x - skipping eexec.c (File already exists)'
  565. else
  566. echo 'x - extracting eexec.c (Text)'
  567. sed 's/^X//' << 'SHAR_EOF' > 'eexec.c' &&
  568. /*
  569. X * eexec.c -- decrypt an Adobe font file encrypted for eexec
  570. X *
  571. X * Chris B. Sears
  572. X */
  573. #include <stdio.h>
  574. #include <strings.h>
  575. X
  576. #define TRUE                1
  577. #define FALSE                0
  578. X
  579. #define EEXEC_SKIP_BYTES    4
  580. X
  581. unsigned short int er =        55665;
  582. unsigned short int ec1 =    52845;
  583. unsigned short int ec2 =    22719;
  584. X
  585. unsigned char
  586. DeCrypt(ch1, ch2)
  587. X    unsigned char ch1, ch2;
  588. {
  589. X    unsigned char plain, cipher;
  590. X
  591. X    /*
  592. X     * Decode hex.
  593. X     */
  594. X    if ('A' <= ch1 && ch1 <= 'F')
  595. X        ch1 -= 'A' - 10;
  596. X    else if ('a' <= ch1 && ch1 <= 'f')
  597. X        ch1 -= 'a' - 10;
  598. X    else
  599. X        ch1 -= '0';
  600. X
  601. X    if ('A' <= ch2 && ch2 <= 'F')
  602. X        ch2 -= 'A' - 10;
  603. X    else if ('a' <= ch2 && ch2 <= 'f')
  604. X        ch2 -= 'a' - 10;
  605. X    else
  606. X        ch2 -= '0';
  607. X
  608. X    /*
  609. X     * Decode cipher.
  610. X     */
  611. X    cipher = ch1 * 16 + ch2;
  612. X
  613. X    plain = (cipher ^ (er >> 8));
  614. X    er = (cipher + er) * ec1 + ec2;
  615. X
  616. X    return plain;
  617. }
  618. X
  619. void
  620. main(argc, argv)
  621. X    int argc;
  622. X    char **argv;
  623. {
  624. X    FILE *in;
  625. X    char in_buff[BUFSIZ], out_buff[BUFSIZ];
  626. X    int i, o, in_size;
  627. X    int skip_salt = TRUE;
  628. X
  629. X    if (argc != 2) {
  630. X        fprintf(stderr, "Usage: %s input\n", argv[0]);
  631. X        exit(0);
  632. X    }
  633. X
  634. X    if ((in = fopen(argv[1], "r")) == NULL) {
  635. X        fprintf(stderr, "%s: can't open %s\n", argv[0], argv[1]);
  636. X        exit(0);
  637. X    }
  638. X
  639. X    /*
  640. X     * Just copy to output until we see an eexec.
  641. X     */
  642. X    while (fgets(in_buff, BUFSIZ, in) != NULL) {
  643. X        if (strcmp(in_buff, "currentfile eexec\n") == 0)
  644. X            break;
  645. X        fprintf(stdout, "%s", in_buff);
  646. X    }
  647. X
  648. X    for (;;) {
  649. X        if (fgets(in_buff, BUFSIZ, in) == NULL)
  650. X            break;
  651. X        in_size = strlen(in_buff) - 1;
  652. X
  653. X        /*
  654. X         * Decrypt a line of hex.
  655. X         */
  656. X        for (i = o = 0; i < in_size; i += 2)
  657. X            out_buff[o++] = DeCrypt(in_buff[i], in_buff[i + 1]);
  658. X
  659. X        /*
  660. X         * Skip the salt if this is the first cypher line.
  661. X         */
  662. X        if (skip_salt) {
  663. X            fwrite(out_buff + EEXEC_SKIP_BYTES,
  664. X                o - EEXEC_SKIP_BYTES, 1, stdout);
  665. X            skip_salt = FALSE;
  666. X        } else
  667. X            fwrite(out_buff, o, 1, stdout);
  668. X    }
  669. X
  670. X    fclose(in);
  671. X
  672. X    exit(0);
  673. }
  674. SHAR_EOF
  675. chmod 0666 eexec.c ||
  676. echo 'restore of eexec.c failed'
  677. Wc_c="`wc -c < 'eexec.c'`"
  678. test 1833 -eq "$Wc_c" ||
  679.     echo 'eexec.c: original size 1833, current size' "$Wc_c"
  680. fi
  681. # ============= untype1_header.ps ==============
  682. if test -f 'untype1_header.ps' -a X"$1" != X"-c"; then
  683.     echo 'x - skipping untype1_header.ps (File already exists)'
  684. else
  685. echo 'x - extracting untype1_header.ps (Text)'
  686. sed 's/^X//' << 'SHAR_EOF' > 'untype1_header.ps' &&
  687. %!
  688. % untype1_header.ps
  689. %
  690. % Chris B. Sears
  691. %
  692. % After interpreting a decrypted Adobe font program there are four dictionaries
  693. %
  694. %        font (implicit)
  695. %        FontInfo
  696. %        Private
  697. %        CharStrings
  698. %
  699. % The strategy is to redefine certain operators, interpret the font and dump
  700. % the resulting dictionaries while filtering out font hint operators.
  701. % The resulting paths are converted into very simple PostScript using
  702. % the pathforall operator.
  703. %
  704. X
  705. /readonly { } bind def
  706. /executeonly { } bind def
  707. /noaccess { } bind def
  708. /definefont { } bind def
  709. X
  710. %
  711. % This is a hack to make the font code think that it is running
  712. % on a high resolution interpreter.  hires will evaluate to true.
  713. % dtransform is used to determine whether or not hires it true or false.
  714. % It is also used in the othersubrs hint routines.  These are bypassed below.
  715. % If this is not desired the dtransform routine below should be commented out.
  716. %
  717. /dtransform {
  718. X    dup type (arraytype) eq {
  719. X        pop
  720. X    } if
  721. X    [ 2540 72 div 0.0 0.0 -2540 72 div 0.0 0.0 ]
  722. X    //dtransform
  723. } bind def
  724. X
  725. /clearStack { cleartomark mark } bind def
  726. X
  727. %
  728. % commands for starting and finishing
  729. %
  730. /endchar { clearStack } bind def
  731. X
  732. %
  733. % Contrary to the Black Book guidelines, there are three hsbw commands
  734. % associated with a seac command.  Ignore the hsbw before the seac command.
  735. % It is the same as the hwbw for the base character.  Use asb to preemptively
  736. % remove the effect of the accent's hsbw.
  737. %
  738. /seac {                    % Standard Encoding Accented Character
  739. X    /achar exch def        % accent character
  740. X    /bchar exch def        % base character
  741. X    /ady exch def        % accent origin y
  742. X    /adx exch def        % accent origin x
  743. X    /asb exch def        % accent sidebearing
  744. X
  745. X    /xOrigin 0 def /yOrigin 0 def    % ignore the hsbw before the seac
  746. X    newpath 0 0 moveto
  747. X
  748. X    Encoding bchar get load exec    % exec the base character
  749. X
  750. X    /base_width charWidth def        % width of the base character
  751. X
  752. X    /xOrigin adx xOrigin add asb sub def    % the accent origin is relative
  753. X    /yOrigin ady yOrigin add def            % to the base character origin
  754. X
  755. X    Encoding achar get load exec    % exec the accent character
  756. X
  757. X    /charWidth base_width def        % width of the base character
  758. } bind def
  759. X
  760. /hsbw {
  761. X    /charWidth exch def
  762. X    /xOrigin exch xOrigin add def
  763. X
  764. X    xOrigin yOrigin moveto clearStack
  765. } bind def
  766. X
  767. %
  768. % What characters use sbw?  For now just ignore wy.
  769. %
  770. /sbw {
  771. X    pop
  772. X    /charWidth exch def
  773. X    /yOrigin exch yOrigin add def
  774. X    /xOrigin exch xOrigin add def
  775. X    xOrigin yOrigin moveto clearStack
  776. } bind def
  777. X
  778. %
  779. % This opcode was not documented by Adobe in the Black Book.
  780. %
  781. /testadd { gt { add } { pop } ifelse } bind def
  782. X
  783. %
  784. % path construction commands
  785. %
  786. % convert the operators and operands to rmoveto, rlineto and rcurveto.
  787. % chars_closepath has different semantics from PostScript closepath.
  788. %
  789. /chars_closepath { currentpoint closepath moveto clearStack } bind def
  790. /hlineto { 0 rlineto clearStack } bind def
  791. /hmoveto { 0 rmoveto clearStack } bind def
  792. /chars_rlineto { rlineto clearStack } bind def
  793. /chars_rmoveto { rmoveto clearStack } bind def
  794. /vlineto { 0 exch rlineto clearStack } bind def
  795. /vmoveto { 0 exch rmoveto clearStack } bind def
  796. X
  797. %
  798. % Convert the various Type 1 curves into Type 1 rrcurveto's
  799. %
  800. /hvcurveto {
  801. X    /dy3 exch def /dy2 exch def /dx2 exch def /dx1 exch def
  802. X    dx1 0 dx2 dy2 0 dy3 rrcurveto
  803. } bind def
  804. X
  805. /vhcurveto {
  806. X    /dx3 exch def /dy2 exch def /dx2 exch def /dy1 exch def
  807. X    0 dy1 dx2 dy2 dx3 0 rrcurveto
  808. } bind def
  809. X
  810. %
  811. % Convert Type 1 rrcurveto's into PostScript rcurveto's
  812. %
  813. /rrcurveto {
  814. X    /dy3 exch def /dx3 exch def
  815. X    /dy2 exch def /dx2 exch def
  816. X    /dy1 exch def /dx1 exch def
  817. X    dx1 dy1
  818. X    dx1 dx2 add dy1 dy2 add
  819. X    dx1 dx2 dx3 add add dy1 dy2 dy3 add add
  820. X    rcurveto clearStack
  821. } bind def
  822. X
  823. %
  824. % ignore hint commands
  825. %
  826. /dotsection { clearStack } bind def
  827. /hstem { clearStack } bind def
  828. /hstem3 { clearStack } bind def
  829. /vstem { clearStack } bind def
  830. /vstem3 { clearStack } bind def
  831. X
  832. %
  833. % Arithmetic command
  834. %
  835. /chars_div { div } bind def
  836. X
  837. %
  838. % Subroutine commands
  839. % All OtherSubr routines are hint related and are ignored.
  840. % They leave their arguments on the stack unchanged.
  841. %
  842. /callothersubr { } bind def
  843. X
  844. %
  845. % For 0, 1, 2 the stack contents are left unchanged.
  846. % For 3, the trailing pop will push a 3 on the stack.
  847. % See p. 95 of the Black Book.
  848. %
  849. /callsubr {
  850. X    /i exch def
  851. X    i 0 eq {
  852. X        pop pop pop        % unused Flex height control parameter and end points
  853. X        /y5 exch def /x5 exch def
  854. X        /y4 exch def /x4 exch def
  855. X        /y3 exch def /x3 exch def
  856. X        /y2 exch def /x2 exch def
  857. X        /y1 exch def /x1 exch def
  858. X        /y0 exch def /x0 exch def
  859. X        /yRef exch def /xRef exch def
  860. X
  861. X        x0 xRef add y0 yRef add x1 y1 x2 y2 rrcurveto
  862. X        x3 y3 x4 y4 x5 y5 rrcurveto
  863. X
  864. %
  865. % The Flex can be replaced by a lineto.
  866. %
  867. X
  868. X        /chars_rmoveto { rmoveto clearStack } def
  869. X    } if
  870. X    i 1 eq {
  871. X        /chars_rmoveto { } def
  872. X    } if
  873. X    i 2 eq { } if        % leave the arguments on the stack
  874. X    i 3 eq { } if
  875. X    i 3 gt {            % normal subroutines
  876. X        Subrs i get exec
  877. X    } if
  878. } bind def
  879. X
  880. /return { } bind def
  881. X
  882. /chars_pop {            % transfers from PS stack to BuildChar stack
  883. X    3                    % see Black Book, page 70
  884. } bind def                % this may need to be changed with new Type 1 versions
  885. X
  886. %
  887. % setcurrentpoint shouldn't appear in a charstring program.
  888. % It should only appear in unused subroutines.
  889. %
  890. SHAR_EOF
  891. chmod 0644 untype1_header.ps ||
  892. echo 'restore of untype1_header.ps failed'
  893. Wc_c="`wc -c < 'untype1_header.ps'`"
  894. test 5109 -eq "$Wc_c" ||
  895.     echo 'untype1_header.ps: original size 5109, current size' "$Wc_c"
  896. fi
  897. # ============= untype1_trailer.ps ==============
  898. if test -f 'untype1_trailer.ps' -a X"$1" != X"-c"; then
  899.     echo 'x - skipping untype1_trailer.ps (File already exists)'
  900. else
  901. echo 'x - extracting untype1_trailer.ps (Text)'
  902. sed 's/^X//' << 'SHAR_EOF' > 'untype1_trailer.ps' &&
  903. %
  904. % untype1_trailer.ps
  905. %
  906. %
  907. % Chris B. Sears
  908. %
  909. X
  910. /printString 20 string def
  911. X
  912. %
  913. % All of the numbers being passed in are real equivalents of integers.
  914. % Convert them back into ints before printing so that print doesn't
  915. % append a ".0"
  916. %
  917. /printNumbers {
  918. X    /ii exch def    % careful about using /i since it is a defined proc
  919. X    ii 1 sub -1 0 { index round cvi printString cvs print ( ) print } for
  920. X    ii { pop } repeat
  921. } bind def
  922. X
  923. %
  924. % Traverse the dictionaries and arrays.
  925. %
  926. begin
  927. Private begin
  928. FontInfo begin
  929. CharStrings begin
  930. 100 dict begin
  931. X
  932. 100 100 moveto
  933. X
  934. /Notice where {
  935. X    pop
  936. X    (/Notice \() print
  937. X    Notice print
  938. X    (\) readonly def\n) print
  939. } {
  940. X    (/Notice \(NoNotice\) readonly def\n) print
  941. } ifelse
  942. X
  943. /Copyright where {
  944. X    pop
  945. X    (/Copyright \() print
  946. X    Copyright print
  947. X    (\) readonly def\n) print
  948. } {
  949. X    (/Copyright \(NoCopyright\) readonly def\n) print
  950. } ifelse
  951. X
  952. /FullName where {
  953. X    pop
  954. X    (/FullName \() print
  955. X    FullName print
  956. X    (\) readonly def\n) print
  957. } {
  958. X    (/FullName \(NoName\) readonly def\n) print
  959. } ifelse
  960. X
  961. 10 setflat
  962. X
  963. CharStrings { % name procedure
  964. X    /proc exch def
  965. X    /name exch def
  966. X    save
  967. X        /xOrigin 0 def
  968. X        /yOrigin 0 def
  969. X        (/) print name printString cvs print ( { ) print
  970. X        mark gsave newpath proc cleartomark
  971. %            flattenpath        % You might want to experiment with setflat
  972. X            (/charWidth ) print charWidth 1 printNumbers (def ) print
  973. X            { 2 printNumbers (moveto ) print }    % If the lines are too long
  974. X            { 2 printNumbers (lineto ) print }    % you might want to change
  975. X            { 6 printNumbers (curveto ) print }    % the trailing spaces to
  976. X            { (closepath ) print } pathforall    % trailing newlines: \n
  977. X        grestore
  978. X        (} def\n) print
  979. X    restore
  980. X    0 40 rmoveto
  981. } bind forall
  982. SHAR_EOF
  983. chmod 0644 untype1_trailer.ps ||
  984. echo 'restore of untype1_trailer.ps failed'
  985. Wc_c="`wc -c < 'untype1_trailer.ps'`"
  986. test 1639 -eq "$Wc_c" ||
  987.     echo 'untype1_trailer.ps: original size 1639, current size' "$Wc_c"
  988. fi
  989. # ============= untype1 ==============
  990. if test -f 'untype1' -a X"$1" != X"-c"; then
  991.     echo 'x - skipping untype1 (File already exists)'
  992. else
  993. echo 'x - extracting untype1 (Text)'
  994. sed 's/^X//' << 'SHAR_EOF' > 'untype1' &&
  995. #!/bin/sh
  996. #
  997. # untype1 -- transform an Adobe Type 1 font file encrypted
  998. #            with eexec and CharStrings into raw PostScript
  999. #
  1000. X
  1001. PROGRAM=`basename $0`
  1002. DIRECTORY=`dirname $0`
  1003. TMP1=/tmp/$$.tr1
  1004. TMP2=/tmp/$$.tr2
  1005. TMP3=/tmp/$$.tr3
  1006. TMP4=/tmp/$$.tr4
  1007. X
  1008. trap 'rm -f /tmp/$$.tr?; exit 0' 0 1 2 15
  1009. X
  1010. case $# in
  1011. 2) ;;
  1012. *) echo "Usage: $PROGRAM \"Adobe Type 1 font file\" \"PostScript output file\""
  1013. X   exit 1;;
  1014. esac
  1015. X
  1016. $DIRECTORY/eexec $1 > $TMP1
  1017. $DIRECTORY/chars $TMP1 $TMP2
  1018. sed -e '/definefont/,$d' $TMP2 > $TMP3
  1019. cat $DIRECTORY/untype1_header.ps $TMP3 $DIRECTORY/untype1_trailer.ps > $TMP4
  1020. X
  1021. echo flush quit >> $TMP4
  1022. gs -DNODISPLAY $TMP4 > $2      # GhostScript
  1023. X
  1024. #nsh $TMP4 > $2                 # NeWS
  1025. X
  1026. #DPStest > $2 <<end-of-here     # Display PostScript
  1027. #$TMP4
  1028. #end-of-here
  1029. SHAR_EOF
  1030. chmod 0755 untype1 ||
  1031. echo 'restore of untype1 failed'
  1032. Wc_c="`wc -c < 'untype1'`"
  1033. test 764 -eq "$Wc_c" ||
  1034.     echo 'untype1: original size 764, current size' "$Wc_c"
  1035. fi
  1036. # ============= un-adobe.hqx ==============
  1037. if test -f 'un-adobe.hqx' -a X"$1" != X"-c"; then
  1038.     echo 'x - skipping un-adobe.hqx (File already exists)'
  1039. else
  1040. echo 'x - extracting un-adobe.hqx (Text)'
  1041. sed 's/^X//' << 'SHAR_EOF' > 'un-adobe.hqx' &&
  1042. Date: Tue, 13 Mar 90 23:59:57 -0800
  1043. XFrom: C43MRP%AVIARY.gm@hac2arpa.hac.com
  1044. Subject: unAdobe.hqx
  1045. X
  1046. unAdobe is an application that converts an Adobe type 1 font into printable
  1047. ASCII characters that can be edited into a postscript document.  Written by
  1048. Jerry Keough and Ted Ede of the Mitre Corp.
  1049. X
  1050. Enjoy!
  1051. X
  1052. Mark Probert
  1053. Delco Electronics
  1054. X
  1055. (This file must be converted with BinHex 4.0)
  1056. X
  1057. :#h9Z3@4[BQ8ZFfPd!&0*9#&6593K!3!!!"Ld!!!!!2rl8dP8)3!"!!!BY(*-BA8
  1058. "!!!!!!!!!!)!"h9Z3@4[BQ8Y6'pRT3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1059. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%&38%a+5e4&)3#IZ*E*RlL@c!!!(Hi
  1060. !!!!!!!!B,J!!!!#eC`!!!!!!!!!!)T!!!!!%#!LJ!j+!(!i'0%83`)i"p`"!)4#
  1061. %J)%KBGb-+F1QB8%#*J#d+%!!dB%kES+3!(NMTS`!JN'J3''LC!Q9)L!#!J)!T#%
  1062. $3J&McUaj-bH!R6dp+QeBJFdRA*D5+HhJEJF"D!#D@%55KJbC-QimMKS)S&D!L4F
  1063. cEZcBm!3!G!i$E0RTN3KC+fF*&#LLTX`B1NUlN!"pNlF!%6PTl*44kTB"J&`!c#e
  1064. e@qia!(Y,q3$J"k"2!#Td!fC!!`#"3#G@rU&c%SFeL,!-)%!!)j!!"Zd!6N#i+&d
  1065. &8!XJrpK9HI+M"6mK50`%e`f!!HJA!*cSNU"PaaGq4QkE%0+QRaAQcRhhC-!F3Hr
  1066. ITE-mHE%E!4`"d+8c`#5pJTd@Ae5c9bhGJUrpUqPLJ4$X0IHDIK!8L)"d#1LJi([
  1067. akF+!'2L9GL!k,8$4R"+ZP2C'3'$!!F9[`BN)5iF)I&KD#f%K%0a`a4fAA(!&-L"
  1068. G",TBKaf-aL(A"Mp+"0%12dL!J)!8J%3BJ5Fk'L%L0"dbJ"i$F-!#jBSp)3#'*J$
  1069. @4dZAZP$J$'d!%,'"CJ(`8`5C1X6S)cp3a1L%G!CSFkC!DT)*!K+!-0#6!@4B!!d
  1070. 3-1`!J!&1l!1!!2l`iJm`rU$cMc,r8$1T%ek!m!886cJ"$@Vq1-1DDbd1iBirm-$
  1071. aJ`MB4)(-2rcmX"X$U#L5(!!2*1F20$r`F*SZ$[M4J4[q["-U(!"!i%+S2`#!#L,
  1072. $k3S2+Sc!`%-!N!"!mJ85`!6#Q3$0bTSX+T0)L`SKQ'Vka$X!+1!TU++f&XGVTCQ
  1073. +UUUXZJUVZ,6D'PDZa2,U+fl!8M"XXFFQZk`cc6iV,J6L5N#ZZHKQqX@kcEfEQML
  1074. MaY'$CNDSpM%!-[bMcXF"L"!FbX,miijk3T`b)cT)k$'!"am-h#X!!m$a$h4#R""
  1075. c+K2Jp`mjqj'$bK`lSp#"CJ2m)`kbbNSGVUmBe#`!0p,jSmh14M`YN!$89,YJ03!
  1076. l-k#e*&hcXR-9BJG!YX*Rlkb!eR2UiSmR1mmKK0P6dbh1eFeTMDMHJZ`Xb0pc9cd
  1077. ifVkUV8F!`(4YaXkEa0dii)4,(S!QA51ambZ-"qiii3R8(!!5AE1`FbkPPefhVkR
  1078. V!3$AHN2XDc0JDfikjj!!!e!l!+adMFA1[2[+51b#Selc89hMJ2c1d[JZqq-l$jq
  1079. h2aC-Ikd)c*mHr2!L50H22F1P3JF%(bJ38!"+!("'3!5!i8l5U9#!U40e,2"%(A5
  1080. !!`""B)BdX+%-$TL#AplJ"M+!J!aT#!-EhR!'(9K!!8P`J`$T3%!$PX%#$6"#'Z3
  1081. `"`j#8))8e-%6U)#'-S#J#8QJJK4`-S3hb!%10J`$(G,!3"#%B3jcU%-EA1L'0i"
  1082. !$Q@B!`lG-)FdL-'!DD"$(JKS3a$3SB8JU--FA2J'-eJ4$@QBJ`rK!!FfT'%-1Z5
  1083. K'ea!!aD'FBaP2'-DHrM')R,3$&@FJ`6,`!)#PS%M"%5L#qPJa$'m!3jjF)%&$U!
  1084. #%)#JNBp%`42G%!Bj6"'2FQL$$N'3!!Bh%0+(EJ""%+B`K#3NJBUCh'3"$kK)&EK
  1085. 4M'%JSaR4Z--HSJ31B4M$'Q"*48pb-T4"%!0,bR##19L!"&G!$"hS!"B3L''+5LL
  1086. $(#`*JL@8i3ee1!-D31P!+T6"J8Ai5LYVL%M%D*1$U3""$(+!!a`iFiSXG#%-C8K
  1087. $'q*3$R0Fi`94ST*KZZ#I&J#!"))QR3)S!cArJ)Gd$Z!$)IP$"#p!!#VFJ!TrT%)
  1088. #UB""+TJaY$fJ!JT`#-!+J!#N(@LQ!855$Mm)JB3I3D'Pr-ME!-LJ"10!BAi!S%@
  1089. dA#URR38J&F4S%J2Dm!pB'3'RKS$T5hmN"1N%!!0#-%i46"S!H[5$#M"S`9@P!)3
  1090. G!1'UkRN"$cJe"5S8jkUT!-8+[Y!2+#LK&@h&+3eHS&8Sh)J#G'fVG##!#4"d"`S
  1091. [J%"BkbUG"rK#1[P!4PlYUJX)''+aU4M&@pYk"@!3i5K5MGmC01%QTmT"U6$0Q`"
  1092. F3CYrX-i,G,)!U%64XC&"`@8MZ`'0c-D1jl&"9k+J&`-LqMbcqNS!dP'!(l$`"0c
  1093. 'E%DXRBiNULB+p`P%X`%K$fb%-"Z%k(CRTP81+b)UR36BJPi)J)%VrS'+G'fU8p"
  1094. !J![iZC+@"&3#U1N(1cUQ@hZPDP@YHP@XI*9G9#@R(`V943)qk`B!rpFGd[Q(%C6
  1095. J!J#E)5!')"-MSP9JH-LU(qi!,hFPT)FHX*8G5LJ`1ajm+$+KJ3(+UBCm58`##J2
  1096. i`[IM!9'+)0DEB)%+mK'!Kq9,*JkJq"r2@(&!*$!Fm2i!![+Kaij",')5Dm$&&Qj
  1097. `KPZdB3BJB-RQjC6'60Ba',9R4[19%!JmE$)[PfBrB@D!(mLX$M-[5%+5B,0jUB"
  1098. H8*'$[Q&4J(haP9pB84K9iN+!VX+m!%Kif"rZm,)rDNZX!$'!!)GqfAU@&D!'#!)
  1099. rrN$DXZi-,'@`*p25FB!6&-hS5,dQdi%0lT@rJ'K5bmF!N6Dc!h5&MP-M$FN#0NH
  1100. N2meT"dL!ep*T!!ZbA'FV"!3*ji#!)m-#!4(!TMa&d!F!@#!"$0KJB1R)!!8#)!!
  1101. Ki%S#mXK*&*Ea$hP-!4"Q-!F6[N'!"9RX'jb*VUGJ%!-Cc)!'0E$"$A#3!)-J#'%
  1102. )4#L#%4$+0RQj&VDDN5dl@X!(*PaKi2q3!!5DR`H&Q2Pd4T)iVR+5#`%&-0Hjm*0
  1103. IG(9,h4jIPlmcfZkE$q!"m)UA[-6fP%!0!!4m!#%9b3""FFq"!3#B`!%S3%!B$,"
  1104. Z!'#!IbpB!!PDm!pCQ!%NAq$IGQia$$%3i"E%%)-"5,!#%+R$U8K33YF0F!B)"%%
  1105. I!B!$$&BKd,-(!!a1*3$A!b)G!("!#B)!!c'J!i)&!!-A!p$!#BJULi#-Y1NJq!$
  1106. 58lB!B3"H!d0S"q)M8(CB"1)-""!"%-"!$a!!3353!"#"iZYJ,AVB!1GK8-!CJ%Y
  1107. k(Y$M"MK(0K!!!3+Qbk,X)QMmiber"JGi(J33-)-peXeYC2'2q!))+G)4X+jr1%-
  1108. )VfM1#`ibd!m0k%-D#-)k!'#"kGYGjk!!`!dqe(-#B%`'QP)#%-kJ!6rpSaT29hi
  1109. Gh*q1"rY$(Q)(!18"i!pe',m1%G9mcaGpZd9p3Q"p"`J!'J"qc-FZk2F&kRF'$1"
  1110. qd'"rZL"rraH!lq"md#Gp"SL!f!Gq#A"qkEGq#&"6rk!+mq-2KX!rq4F"CL!#!YL
  1111. "$2!$D`!!"'"di"F!jaH"*mKd+XKrA-!r#F!%8`!&hY3'b)+$-H!#-K!%!$!&4!8
  1112. 1*V8Srq!0h2%2f#!%VG"d@DJ+*J8$-!"cZX!6GBF&G3F+6L9UZK!!%X!#6@!#%2J
  1113. "Cd!#GJ!!0Y!#!!!#iE!%,I93%e94&j94'p941KF*``!+,H"8j6-0BA"8#V!'%'"
  1114. 5rj!!$rp32(9!LIG`LIb6KCJB"LT3GQ[!!CVi$kj!LIM`$l$!2j4SLDI)"rqJ$kV
  1115. BL86P#PQiLR8!!6JJ!!GJ"KDJL`)3#@T!!2rh%VJb"3"J"[6J-r`MIdI3$[S!!N,
  1116. 3G3H!!0Xh%!G`!CVa%K%!"G[R!&'`I3EJMFd4MJ$3!%,!GJK`!pX)!"5JMHHB,1C
  1117. M#Xpi$ri`M3"3MGXA%0Q)*[T(MZ!SMZE)!1D)MZV)MS[LM[$B!2+S#rhJ"[`6!jc
  1118. 4!!UJ"*hBKD6!2e!JHDT3HdeR"JV!K8dA"4bC#[4J!N$30@L3!(pNChEki!q3!,"
  1119. fEIH5J0!e*!!#A3F!B#!05V#,MU!'MB3(!3!$3i!2!8!"4J)*N8!($!!,J["")K!
  1120. &)B!-4bN#J#!%%5!#H#!!UL!#L!!#JK!0UC!!-A8!#Q2!2`63K%m)!-J'$-!!!Y"
  1121. "!4"PG#r`)4$JMQ%`Dq`b%"L`EJ-`!-6&2mJ'!`"!!Q`T"-83$#D`1N0`$-"J$FJ
  1122. a"2mQ$)mC##!`!%9R)hA3PX!`Pa4`"N)!Ph4TPhMT)&$BPpr`Pi'jQHIJPTjj"Si
  1123. %(4J3"KkJ")!`M0!3IAM9%aK3PmRLMRi*Q*e5"mJ5#-#!E$i!!#S!!'SJ!%3!##`
  1124. 3!-e*")&JQ)XT"&FC#(M`!H-J#H-!#H13!!L`-!KY3!#3!$!)8K!)8d!%E1!15P!
  1125. )d`N)Zf!)daN)4FF(D+Q@8"K4I2FK9,+(EaQJ)##J"*TiQZ)#Rb#BV8PlGSNX!rU
  1126. J"9UJGJN$F5N((f!15#!*K"+A!Y!6"a!!m(#Aa$F!,h!&Km)&`iPXm-#J4ZHJ%3U
  1127. K-%TqG2!"&'Th'%S*3'#K0HS"'+UK-#!!B$#1m"!3A!8,3I!'pV#M(CU2G[!2iE!
  1128. #a`!$G`N("b!$d-%"!J#&"`!*3G#Ni!#P-*!!%m6h!#9D'PV'QZ$!SK5JSp#K!6d
  1129. +"-J#"LG)Q-N)"88D"'f`M!F`9`VBEIN)#8*!"rm!$LTJ"!)!!9)+!-!J!'B!!fa
  1130. UG'm+!fpR!%T!TfE!!9cP*`$`!@mJ$c@+!8Yk!))D$S9kU)QkU-4h!%"`$Vlj%JT
  1131. !"0p`TQh*SSKDS4HDS4[UMU(UQiiK!8-TSYm3!!1!SJVUPL$`)A**IR*`!##3!!'
  1132. "J!P4N!!-X4LFCBS!XYUDEiQX)U#Xc*S"`3#YdUS2e'ULeTULf(UXlVLY4VHXc@S
  1133. %J2#YdIS2q$#ZCQUZi!!-RiUZ'U#Z(Z#E&!!!(M!SKA)SLC+3!)lK'!hK!3$J!P3
  1134. k#iKJ"IVPP`H!-Hj#R!FJ!KK!!KNJ#))J#i)!XIpJ$f"J$P5+X4T,#)&!#i%!XL*
  1135. V$CaTTHk)VKBJ!NL!,#,3Q6KlXcUEXjf*I9-3"'IJ!A$`!9`U$NN3"%-+!$#3!!h
  1136. abJrdUJ!8bcm4N!!&Q`S'YA81pkUZ')#Z(1#[GNFe'%!$!T8"K8F'!V"Y8m!G#$!
  1137. ,#'!&P-)2CL!!K5Ha82!)5+F!kSS!*1#I03S"BLX"'L!,!Q#ffbB"`J!'!L!"fK!
  1138. &E`X,!8!#Ak!Zl1)Zd$#Vk2TVrLP39!-"-!X"2cX&31!5A$ULA'#h!+J!k1SHbB)
  1139. "FJ!!kXS!J%%"'3!,h(&-5#!&Sm3G%$!,#Z#fX()'4i)%S!X'hY#kN!#V+CcL!i%
  1140. `Ep""!%2!,JBJ!`"3$NNJ$F%!!P%J!TH!E!!!$UdV"8J!"KT!!MVNMKSJ$B2,!*3
  1141. 3!&13!(`!)!IrJ,J3X,K[UbrNX'i(N!!XJH!#5B#l)(!&RN)#02S"E1#q-[!"EX!
  1142. !4"!%Z-ZP"B`XFK!!QL)#9r!#!K#l%!!0`5!&3N!*39$!J%'lEb!!2bS"`)#i%Y"
  1143. R-98()dV"E3QRb3)"+D`[r#$!-%$!"Sc!#Xc!3H$!lK["QQ,"'1c"(2`''#$#*"b
  1144. -%)#M'M`%55Zr62Zfr*0i"i`%35!$r#8#NIXK""#l%3!"83`V@[brB%!!e-U@2!F
  1145. $H!!!9*-"''`$!!#CYR#N"'!$!B!(r`!"Jf$&3H)'!K$"2bX,"bJ!-L!!Z&X%m##
  1146. T4a#L!8!$#f!#5Q!*`%!*5d!%h'%!&6!#M!XVL(bAPX$!3f!,32!'"J$(L%X"6%Y
  1147. Zr#!&4,"Z$("dG4!&`B#i8"!-#18-3H!1cKF#,E+(-F"X4ZGXc4%#89#B3N!D,#!
  1148. %U,#`5K!!6`F+3#S!S$!!2G!6%L$-$#!#bi`#Q+,&m%B3lK)0#!8-ZI`2`-$,[bN
  1149. "[qb1h(I-GJF+"e$0h)I0-V$-&J!#++#dD5S1J!!-F1%$i`!)i3!)`S`!9YR0Ar$
  1150. 0!5&UiT`Dj+c,j``E!J8+&#$2cGBLpFap#&fh6Y$3jPc1%GdZ!VA1TQ%"S&!"mLa
  1151. UAU$&TG[4i`c5*-epk1`q%J!+%j!!dJMGdKjYT,S-#qJX!5-0c!15caS!#LF)",l
  1152. ScK`!#Z5"!%-!&b!J!Zj3'L)3*D$3!2+X@LZGd2%'!!apbqAX$1MX!%(G(1e-e%+
  1153. 3!-mES-c[l,SB[F`B)-r`p@jG6EPJVF[1X-k1J3'J%0Fpi3!&VFd,Qp0fkp'iM0I
  1154. V60BBS0I6KXkQi3+J3!3@[G'&IGI1apKm(3%T(GM,c!'%lG+TFGLA,G%Bi0M[,!%
  1155. i[G8kEGPjhFYm(3$bl#i@3`9fqbQT`G1U10CPl4K$VB"+cG4b(343AG$@NLbJi!)
  1156. )VG$Y!YUU@-iq(4CNVFi5hGXDm0X-m04lk(+q!J((lGaA,GI*AGI-,GTL$GflIGB
  1157. +D0T,[3$J[GA+(FkX2G0PAG*TVB#JN!!!UFh5K3d+`iCfR$$'A`!+!)afS4Hj6`!
  1158. +'H!0R#&UD#F)!+k)6S"fH!!+0K$K!8!(SD!"hNF!&Ui'$li"&Zi&,l#9$-(KD-F
  1159. &)mk91'MK8M$'(a!+)Z!#L'$K2[$J)f$K02$J*H!#YfN!3R!*&Ni#&Zi",UiTS#$
  1160. ND#HANIX&S@!#-QlK"VhNSB!#6bjYqP$N!Ai#%3i!m1$LSH!"93i!j2$JLLGYf[$
  1161. J)F$MDZ$M3#jY"b9Ya)$PS!!#@ki,!"i+5"$QVJ!+AGX6*Nim@K`+(5!##+!T),#
  1162. r05PYNZ$LS-!%2,lPKX$S+5PYIX$S6E$PG2$J+l$P(VlNS*!!!PX1"JqZ!PYZ"3q
  1163. H"&[1"!pZNG)Q"!qq"&Z1!b-q!2R-iA8JHSRhi#iJ!N'`jA!TP+Eajal`!eZC%lB
  1164. qiN1jiY,fRbq3!!!aX+Kd6T`k1AbT#3#mG3iIi!-J%!&r&hKQB!"`-!NGMJ**J!$
  1165. rHJ"RB!$@mJq,B$mX)*3BB!*KiES4i(L"aqY4N!!))T!!!J&KlaVJ!J%3"BH!,0-
  1166. 3$,1`$'43'dV!lr)$!@SJ%#SJ!QQ!Jp2J$%S3!6FB!%6q!##`PDSJ#F[-a[p!!Vk
  1167. #J`$JX@dJ%!C!!0i'#*)J#!J3#!(a#F(J#C`K!5U`(P"Bk&33"8M`!U4"%#"!!Gf
  1168. ZiH2a!963N!!!i!e+)!&Q`!)LX*al'2#!!!Q(i%,!b`#K`3!I"!*8)!*+82!JF!#
  1169. 6!!b4B08Z!!*-S&CJB!HD8AIQi&6FA)DJ%28"8AXi+#3#"IB&ArEF!!KRhac(V35
  1170. (J&0+!!)*!!Q+`(iL!!"4%!L5F281N!$e-KpGC8!!AJm'TP!#5F%%dD#d0ik$)f!
  1171. %!6%"QT%8c9jh,9L'b&"hRlFYR`m$B!#YL4!&8B,iLSpjR"m3**!!"#63$RI2"*(
  1172. J$#5!$#LJ#"J3I4#!,0r!,JLJi!+eERb!$mmZ!0%qp'HJ!%A[H6jIaVN-!$QHc`$
  1173. JldSJrK+S"R**'J43m4Hr"JT!!NJ3$F%3#mY3"Yi3T,%!r!``"JT9"hL2!,$J%,3
  1174. "khF!)Sp!mAV4i"K%!Q$J#3$"5-&"MHqiUEfapm`fRIq$!Mk2!SJr+!!)3N"5L!$
  1175. H"J"%Jh-'K3$!0)J58maAd)9'acrSJ!6l!Mm!2L#!9U!1k-!!L($rJ"l3!H!LLp`
  1176. "(6"aUN(S%33kK3#-d@qkHfB)q*'k1&!!l)"2539*Db!8&Ap`&(K'&43!J1!4r!0
  1177. "-(X@"3Mi"9)$!Z`%!4$crS%j)!!l33%)J%rJ$bE!2pJ*L'm3q!-JN!!!GJ)J5!#
  1178. r)"`)$d!J!!4!!MJ%p-!!e%%%S!$`S!bVJe%Y!A`#)1!(kZ"15!#G)#!N!%%J#@R
  1179. "!I!(#3!4&-(%&`(%33+BFhi3'!`"IH!)rH!ri"RjJ#l)MD,##PZK+hb&X$!@bX*
  1180. C5!YVS5fmKEL`&Vk2J2!2U1!Uj"Q!B!!!J[a&14c!!!J%i)!$()"K!!p`J!-i"lJ
  1181. !$RL!1m!"`)%2d!%1!"Mi!@8)+BaK-2!(4f!!$!0r-!B'`6(`"h&J'$`$I`!'aX%
  1182. j*!*cB"`kJ((`$6r!-)!82f!3D--r-!#!J5r`!`-J((J$2R!!jS!c`!-1i!FB!MM
  1183. !!6l!!!!(cT!!FP#TS`!1K#(P@)8lSDJX"B+`K2j!8F%((P&HK853!2J44k**,)N
  1184. IN4@QST5)%N9L5b5*,M%Q`X5CH"*PBNfNL5pa*'l%T8!#CJa"#!"*B!JiJ4%J%(D
  1185. K3!J!!F!)c"$54aDD)P)N#'kJ$E#ABG*(RSRAqbBJ)*bi%"-!!U,*0*NLeJ5ED"0
  1186. meJ6#3#GK!p"%QPL5&*!!pXK*(M!RD!#G["1[KdAQb3`"!6ANKZ53!&Ub4N3*'f!
  1187. $4b30R"-aJN5fL"a3$'4J0r!MSF!%P-)"X$&*Mb`8aB"J%"##3J!!$+%2!J%")!m
  1188. )!JI!M$KS#$b"J&-898"3()T&83JdP9C'%,5!6``)CN!T#TbLf,T@SGJL#!,!"KJ
  1189. #A[J2FN)'B![[iaF#J!`!#4D&$4!%8[!8+L"+d"#5Bd$B!*M!12S"h[JFJ8&c"!!
  1190. DdHj)Vp`i1B3M"qJ"$3&4I`!!:
  1191. SHAR_EOF
  1192. chmod 0644 un-adobe.hqx ||
  1193. echo 'restore of un-adobe.hqx failed'
  1194. Wc_c="`wc -c < 'un-adobe.hqx'`"
  1195. test 9054 -eq "$Wc_c" ||
  1196.     echo 'un-adobe.hqx: original size 9054, current size' "$Wc_c"
  1197. fi
  1198. # ============= view_header.ps ==============
  1199. if test -f 'view_header.ps' -a X"$1" != X"-c"; then
  1200.     echo 'x - skipping view_header.ps (File already exists)'
  1201. else
  1202. echo 'x - extracting view_header.ps (Text)'
  1203. sed 's/^X//' << 'SHAR_EOF' > 'view_header.ps' &&
  1204. %!
  1205. % view_header.ps
  1206. %
  1207. % Chris B. Sears
  1208. %
  1209. X
  1210. 300 dict dup /font_dict exch def
  1211. begin
  1212. SHAR_EOF
  1213. chmod 0644 view_header.ps ||
  1214. echo 'restore of view_header.ps failed'
  1215. Wc_c="`wc -c < 'view_header.ps'`"
  1216. test 81 -eq "$Wc_c" ||
  1217.     echo 'view_header.ps: original size 81, current size' "$Wc_c"
  1218. fi
  1219. # ============= view_trailer.ps ==============
  1220. if test -f 'view_trailer.ps' -a X"$1" != X"-c"; then
  1221.     echo 'x - skipping view_trailer.ps (File already exists)'
  1222. else
  1223. echo 'x - extracting view_trailer.ps (Text)'
  1224. sed 's/^X//' << 'SHAR_EOF' > 'view_trailer.ps' &&
  1225. %
  1226. % view_trailer.ps
  1227. %
  1228. % Chris B. Sears
  1229. %
  1230. X
  1231. end
  1232. X
  1233. %
  1234. % The display order is strange because of the hashing of dictionary entries.
  1235. %
  1236. /printString 30 string def
  1237. /ii 0 def    % careful: the name /i is used as a character name
  1238. /Helvetica findfont 30 scalefont setfont
  1239. 100 100 translate
  1240. X
  1241. font_dict {    % name procedure
  1242. X    /proc exch def
  1243. X    /name exch def
  1244. X    name /.notdef ne name /Notice ne and
  1245. X    name /Copyright ne name /FullName ne and and {
  1246. X        gsave
  1247. X            gsave
  1248. X            erasepage
  1249. X            0.3 0.3 scale
  1250. X            proc stroke
  1251. X            gsave
  1252. X                0 0 moveto 0 1000 rlineto    % why doesn't Adobe use 1024?
  1253. X                1000 0 rlineto 0 -1000 rlineto closepath stroke
  1254. X                charWidth 2 div 0 moveto 0 1000 rlineto closepath stroke
  1255. X                gsave
  1256. X                    10 setlinewidth 0 -5 moveto charWidth 0 rlineto stroke
  1257. X                grestore
  1258. X            grestore
  1259. X            grestore
  1260. X            name printString cvs gsave 0 -50 moveto show grestore
  1261. X            gsave -50 -50 moveto ii printString cvs show grestore
  1262. X            /ii ii 1 add def
  1263. X            usertime 800 add
  1264. X            { dup usertime lt { pop exit } if } loop
  1265. X        grestore
  1266. X    } if
  1267. } bind forall
  1268. X
  1269. 200 -50 moveto (Done) show
  1270. SHAR_EOF
  1271. chmod 0644 view_trailer.ps ||
  1272. echo 'restore of view_trailer.ps failed'
  1273. Wc_c="`wc -c < 'view_trailer.ps'`"
  1274. test 1031 -eq "$Wc_c" ||
  1275.     echo 'view_trailer.ps: original size 1031, current size' "$Wc_c"
  1276. fi
  1277. # ============= reenc.ps ==============
  1278. if test -f 'reenc.ps' -a X"$1" != X"-c"; then
  1279.     echo 'x - skipping reenc.ps (File already exists)'
  1280. else
  1281. echo 'x - extracting reenc.ps (Text)'
  1282. sed 's/^X//' << 'SHAR_EOF' > 'reenc.ps' &&
  1283. %
  1284. % reenc.ps - useful for looking at the seac problem
  1285. %
  1286. % Chris B. Sears
  1287. %
  1288. X
  1289. /reencsmalldict 12 dict def
  1290. /ReEncodeSmall {
  1291. X    reencsmalldict begin
  1292. X    /newcodesandnames exch def
  1293. X    /newfontname exch def
  1294. X    /basefontname exch def
  1295. X
  1296. X    /basefontdict basefontname findfont def
  1297. X    /newfont basefontdict maxlength dict def
  1298. X
  1299. X    basefontdict {
  1300. X        exch dup /FID ne {
  1301. X            dup /Encoding eq {
  1302. X                exch dup length array copy
  1303. X                newfont 3 1 roll put
  1304. X            } {
  1305. X                exch newfont 3 1 roll put
  1306. X            } ifelse
  1307. X        } {
  1308. X            pop pop
  1309. X        } ifelse
  1310. X    } forall
  1311. X
  1312. X    newfont /FontName newfontname put
  1313. X    newcodesandnames aload pop
  1314. X    newcodesandnames length 2 idiv {
  1315. X        newfont /Encoding get 3 1 roll put
  1316. X    } repeat
  1317. X
  1318. X    newfontname newfont definefont pop
  1319. X    end
  1320. } def
  1321. X
  1322. /scandvec [
  1323. X    8#300 /Oacute
  1324. X    8#311 /Adieresis
  1325. X    8#321 /oacute
  1326. X    8#322 /Ograve
  1327. X    8#323 /Scaron
  1328. X    8#324 /ograve
  1329. X    8#325 /scaron
  1330. X    8#330 /Edieresis
  1331. X    8#331 /adieresis
  1332. X    8#332 /edieresis
  1333. X    8#333 /Odieresis
  1334. X    8#334 /odieresis
  1335. X    8#340 /Aacute
  1336. X    8#342 /Aring
  1337. X    8#344 /Zcaron
  1338. X    8#347 /Eacute
  1339. X    8#360 /aacute
  1340. X    8#362 /aring
  1341. X    8#364 /zcaron
  1342. X    8#367 /eacute
  1343. ] def
  1344. X
  1345. 50 50 translate
  1346. X
  1347. /Palatino-Roman /Palatino-Roman-Scand scandvec ReEncodeSmall
  1348. /Palatino-Roman-Scand findfont 100 scalefont setfont
  1349. X
  1350. (\300) 0 0 moveto show
  1351. (\311) 100 0 moveto show
  1352. (\321) 200 0 moveto show
  1353. (\322) 300 0 moveto show
  1354. (\323) 400 0 moveto show
  1355. (\325) 0 100 moveto show
  1356. (\330) 100 100 moveto show
  1357. (\331) 200 100 moveto show
  1358. (\332) 300 100 moveto show
  1359. (\333) 400 100 moveto show
  1360. (\340) 0 200 moveto show
  1361. (\342) 100 200 moveto show
  1362. (\344) 200 200 moveto show
  1363. (\360) 300 200 moveto show
  1364. (\362) 400 200 moveto show
  1365. (\367) 0 300 moveto show
  1366. (\324) 100 300 moveto show
  1367. (\334) 200 300 moveto show
  1368. (\364) 300 300 moveto show
  1369. SHAR_EOF
  1370. chmod 0644 reenc.ps ||
  1371. echo 'restore of reenc.ps failed'
  1372. Wc_c="`wc -c < 'reenc.ps'`"
  1373. test 1661 -eq "$Wc_c" ||
  1374.     echo 'reenc.ps: original size 1661, current size' "$Wc_c"
  1375. fi
  1376. # ============= patchlevel.h ==============
  1377. if test -f 'patchlevel.h' -a X"$1" != X"-c"; then
  1378.     echo 'x - skipping patchlevel.h (File already exists)'
  1379. else
  1380. echo 'x - extracting patchlevel.h (Text)'
  1381. sed 's/^X//' << 'SHAR_EOF' > 'patchlevel.h' &&
  1382. #define PATCHLEVEL 0
  1383. SHAR_EOF
  1384. chmod 0644 patchlevel.h ||
  1385. echo 'restore of patchlevel.h failed'
  1386. Wc_c="`wc -c < 'patchlevel.h'`"
  1387. test 21 -eq "$Wc_c" ||
  1388.     echo 'patchlevel.h: original size 21, current size' "$Wc_c"
  1389. fi
  1390. exit 0
  1391.  
  1392. exit 0 # Just in case...
  1393. -- 
  1394. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1395. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1396. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1397. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1398.